package com.obligatorio.login;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;

import com.obligatorio.domain.Buzon;
import com.obligatorio.domain.Mensaje;
import com.obligatorio.domain.Pais;
import com.obligatorio.domain.Sector;
import com.obligatorio.domain.Usuario;
import com.obligatorio.ejb.ManejadorContactos;
import com.obligatorio.ejb.ManejadorMensaje;
import com.obligatorio.ejb.ManejadorPais;
import com.obligatorio.ejb.ManejadorSector;
import com.obligatorio.ejb.ManejadorUsuario;

@ManagedBean
@SessionScoped
public class UserBkBean {

	private static final Logger log = Logger.getLogger(UserBkBean.class
			.getName());

	private Integer id;
	private String nombre;
	private String apellido;
	private Date fechaNac;
	private String uriFoto;
	private String codPostal;
	private Pais pais;
	private Sector sector;

	private String paisDesc;
	private String sectorDesc;

	private SelectItem selectedPais;
	private SelectItem selectedSector;

	private String pass;
	private String mail;
	private Collection<SelectItem> sectores = new ArrayList<SelectItem>();
	private Collection<Usuario> contactos = new ArrayList<Usuario>();
	private Collection<SelectItem> paises = new ArrayList<SelectItem>();
	private Buzon buzon;
	private String descPersonal;
	private Collection<Mensaje> mensajesEntrada = new ArrayList<Mensaje>();
	private Collection<Mensaje> mensajesSalida = new ArrayList<Mensaje>();
	private Collection<Mensaje> mensajesArchivado = new ArrayList<Mensaje>();
	private Collection<Mensaje> mensajesPapelera = new ArrayList<Mensaje>();
	private Collection<Mensaje> mensajesInvitaciones = new ArrayList<Mensaje>();
	private Mensaje mensaje;

	private String nombrePais;
	private String nombreSector;
	private Usuario logedUser;

	private String user;

	@EJB
	private ManejadorContactos mContacto;

	@EJB
	private ManejadorPais mPais;
	@EJB
	private ManejadorSector mSector;
	@EJB
	private ManejadorUsuario mUsuario;

	@EJB
	private ManejadorMensaje mMensajes;

	public UserBkBean() {
	}

	@PostConstruct
	public void initialize() {
		try {

			HttpSession session = (HttpSession) FacesContext
					.getCurrentInstance().getExternalContext()
					.getSession(false);
			Usuario tmpUsr = (Usuario) session.getAttribute("user");
			setLogedUser(tmpUsr);
			loadUserValues(tmpUsr);
			loadValues(tmpUsr);
			loadMailsValues(tmpUsr);
		} catch (Exception e) {
			log.error(e.getMessage());
			e.printStackTrace();
		}
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getApellido() {
		return apellido;
	}

	public void setApellido(String apellido) {
		this.apellido = apellido;
	}

	public Date getFechaNac() {
		return fechaNac;
	}

	public void setFechaNac(Date fechaNac) {
		this.fechaNac = fechaNac;
	}

	public String getUriFoto() {
		return uriFoto;
	}

	public void setUriFoto(String uriFoto) {
		this.uriFoto = uriFoto;
	}

	public String getCodPostal() {
		return codPostal;
	}

	public void setCodPostal(String codPostal) {
		this.codPostal = codPostal;
	}

	public Pais getPais() {
		return pais;
	}

	public void setPais(Pais pais) {
		this.pais = pais;
		setPaisDesc(pais.toString());
	}

	public String getPaisDesc() {
		return paisDesc;
	}

	public void setPaisDesc(String paisDesc) {
		this.paisDesc = paisDesc;
	}

	public Sector getSector() {
		return sector;
	}

	public void setSector(Sector sector) {
		this.sector = sector;
		setSectorDesc(sector.toString());
	}

	public SelectItem getSelectedPais() {
		return selectedPais;
	}

	public void setSelectedPais(SelectItem pais) {
		this.selectedPais = pais;
	}

	public Usuario getLogedUser() {
		return logedUser;
	}

	public void setLogedUser(Usuario logedUser) {
		this.logedUser = logedUser;
	}

	public String getSectorDesc() {
		return sectorDesc;
	}

	public void setSectorDesc(String sectorDesc) {
		this.sectorDesc = sectorDesc;
	}

	public SelectItem getSelectedSector() {
		return selectedSector;
	}

	public void setSelectedSector(SelectItem sector) {
		this.selectedSector = sector;
	}

	public Collection<SelectItem> getSectores() {
		return sectores;
	}

	public void setSectores(Collection<SelectItem> sectores) {
		this.sectores = sectores;
	}

	public Collection<Usuario> getContactos() {
		return contactos;
	}

	public void setContactos(Collection<Usuario> contactos) {
		this.contactos = contactos;
	}

	public Buzon getBuzon() {
		return buzon;
	}

	public void setBuzon(Buzon buzon) {
		this.buzon = buzon;
	}

	public String getUser() {
		return user;
	}

	public void setUser(String user) {
		this.user = user;
	}

	public String getMail() {
		return mail;
	}

	public void setMail(String mail) {
		this.mail = mail;
	}

	public Collection<SelectItem> getPaises() {
		return paises;
	}

	public String getPass() {
		return pass;
	}

	public void setPass(String pass) {
		this.pass = pass;
	}

	public String getDescPersonal() {
		return descPersonal;
	}

	public void setDescPersonal(String descPersonal) {
		this.descPersonal = descPersonal;
	}

	public void setPaises(Collection<SelectItem> paises) {
		this.paises = paises;
	}

	public Collection<Mensaje> getMensajesEntrada() {
		return mensajesEntrada;
	}

	public void setMensajesEntrada(Collection<Mensaje> mensajesEntrada) {
		this.mensajesEntrada = mensajesEntrada;
	}

	public Collection<Mensaje> getMensajesSalida() {
		return mensajesSalida;
	}

	public void setMensajesSalida(Collection<Mensaje> mensajesSalida) {
		this.mensajesSalida = mensajesSalida;
	}

	public Collection<Mensaje> getMensajesInvitaciones() {
		return mensajesInvitaciones;
	}

	public void setMensajesInvitaciones(Collection<Mensaje> mensajesInvitaciones) {
		this.mensajesInvitaciones = mensajesInvitaciones;
	}

	public Collection<Mensaje> getMensajesArchivado() {
		return mensajesArchivado;
	}

	public void setMensajesArchivado(Collection<Mensaje> mensajesArchivado) {
		this.mensajesArchivado = mensajesArchivado;
	}

	public Collection<Mensaje> getMensajesPapelera() {
		return mensajesPapelera;
	}

	public void setMensajesPapelera(Collection<Mensaje> mensajesPapelera) {
		this.mensajesPapelera = mensajesPapelera;
	}

	public Mensaje getMensaje() {
		return mensaje;
	}

	public void setMensaje(Mensaje mensaje) {
		if (mensaje != null) {
			this.mensaje = mensaje;
			log.info("Mensaje " + this.mensaje.getAsunto());
		}
	}

	public String getNombrePais() {
		return nombrePais;
	}

	public void setNombrePais(String nombrePais) {
		this.nombrePais = nombrePais;
	}

	public String getNombreSector() {
		return nombreSector;
	}

	public void setNombreSector(String nombreSector) {
		this.nombreSector = nombreSector;
	}

	public String guardar() {
		log.info("*** Creando Usuario ***");
		String result = "login.xhtml";
		Usuario tmpUsr = new Usuario(getNombre(), getApellido(), getMail(),
				getPass());

		try {
			if (mUsuario.altaUsuario(tmpUsr)) {
				log.info("Se dio de alta");
			} else {
				log.info("No se dio de alta");
				result = "altaUsuario.xhtml";
			}
		} catch (Exception e) {
			log.error("No se dio de alta faltan datos");
			log.error(e);
			// e.printStackTrace();
			result = "altaUsuario.xhtml";
		}
		log.info("*** *** *** *** *** ***");
		return result;
	}

	public String modificar() {
		log.info("*** Modificando Usuario ***");
		String result = "principal.xhtml";

		HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
				.getExternalContext().getSession(false);
		Usuario tmpUsr = (Usuario) session.getAttribute("user");
		tmpUsr.setFechaNac(getFechaNac());
		tmpUsr.setDescPersonal(getDescPersonal());
		tmpUsr.setPais(new Pais(getPaisDesc()));
		tmpUsr.setSector(new Sector(getSectorDesc()));

		try {
			if (mUsuario.modificarUsuario(tmpUsr) != null) {
				log.info("Se ha modificado el usuario.");
				FacesContext.getCurrentInstance().addMessage(
						null,
						new FacesMessage(FacesMessage.SEVERITY_INFO,
								"El usuario " + tmpUsr.toString()
										+ " ha sido modificado con exito.",
								"Informacion"));
				result = "principal.xhtml";
			} else {
				FacesContext.getCurrentInstance().addMessage(
						null,
						new FacesMessage(FacesMessage.SEVERITY_ERROR,
								"No ha sido posible modificar el usuario : "
										+ tmpUsr.toString(), "Informacion"));
				log.info("No ha sido posible modificar el usuario");
				result = "editarUsuario.xhtml";
			}
		} catch (Exception e) {
			log.error("No se dio de alta faltan datos");
			log.error(e);
			// e.printStackTrace();
			result = "editarUsuario.xhtml";
		}

		log.info("*** *** *** *** *** ***");
		return result;
	}

	private void loadUserValues(Usuario usr) {
		setApellido(usr.getApellido());
		setNombre(usr.getNombre());
		setBuzon(usr.getBuzon());
		setDescPersonal(usr.getDescPersonal());
		setFechaNac(usr.getFechaNac());
		setMail(usr.getEmail());
		setPais(usr.getPais());
		setSector(usr.getSector());
		setSelectedPais(new SelectItem(usr.getPais()));
		setSelectedSector(new SelectItem(usr.getSector()));

	}

	private void loadValues(Usuario usr) throws Exception {
		List<SelectItem> paises = new ArrayList<SelectItem>();
		List<SelectItem> sectores = new ArrayList<SelectItem>();

		List<Pais> paisAux = mPais.ObtenerTodoLosPaises();
		List<Sector> secAux = mSector.ObtenerTodosLosSectores();

		for (int i = 0; i < paisAux.size(); i++) {
			paises.add(i, new SelectItem(paisAux.get(i)));
		}

		for (int i = 0; i < secAux.size(); i++) {
			sectores.add(i, new SelectItem(secAux.get(i)));
		}

		setPaises(paises);
		setSectores(sectores);
		// loadMailsValues()
	}

	private void loadMailsValues(Usuario usr) throws Exception {
		setMensajesArchivado(mMensajes.listaMensajeArchivados(usr));
		setMensajesEntrada(mMensajes.listaMensajeEntrada(usr));
		setMensajesPapelera(mMensajes.listaMensajePapelera(usr));
		setMensajesSalida(mMensajes.listaMensajeEnviados(usr));
		setMensajesInvitaciones(mMensajes.listaMensajeInvitaciones(usr));
	}

	public void mensajeLeido() {
		log.info("Mensaje a cambiar estado :" + mensaje.getId());
	}

	public String archviarMensaje() {
		log.info("archviarMensaje() :" + mensaje.getId());
		String res = "correo.xhtml?faces-redirect=true";
		try {
			if (mMensajes.archivarMensaje(mensaje)) {
				loadMailsValues(logedUser);
			}

		} catch (Exception e) {
			log.error(e.getMessage());
		}
		return res;
	}

	public String borrarMensaje() {
		log.info("borrarMensaje() :" + mensaje.getId());
		String res = "correo.xhtml?faces-redirect=true";
		try {
			if (mMensajes.borrarMensaje(mensaje)) {
				loadMailsValues(logedUser);
			}
		} catch (Exception e) {
			log.error(e.getMessage());
		}
		return res;
	}

	public String aceptarInvitacion() {
		log.info("aceptarInvitacion :" + mensaje.getAsunto());
		String res = "principal.xhtml?faces-redirect=true";
		String cod = mensaje.getNota().substring(11);
		log.info(cod);
		try {
			mContacto.confirmarContacto(cod, logedUser);
		} catch (Exception e) {
			log.error(e);
		}

		return res;

	}

	public void rechazarInvitacion() {
		log.info("rechazarInvitacion :" + mensaje.getId());
	}

}
